///////////////////////////////////////////////////////////////////////
//
// NO_Namespace.h
//
///////////////////////////////////////////////////////////////////////

///////////////////////////////////////////////////////////////////////
#ifndef NO_Namespace_H
#define NO_Namespace_H

///////////////////////////////////////////////////////////////////////
#include "NO_Base.h"
#include "NO_Scope.h"
#include "NO_Member.h"
#include "NO_StaticFunction.h"
#include "NO_MemberFunction.h"
#include "NO_Referencer.h"
#include "NO_Transform.h"
#include "NO_Constructor.h"
#include "NO_Definition.h"
#include "NO_Includes.h"

/////////////////////////////////////////////////////////////////////////
//
// NO_TypeImpl class template
//
//////////////////////////////////////////////////////////////////////////
class NO_Namespace	: public NO_Type
					, public NO_Naming
					, public NO_Scope
					, public NO_FunctionList
					, public NO_MemberList
{
public:
	//////////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	static NO_Namespace& define(const NO_Int8* name, NO_Plugin& plug);

	//////////////////////////////////////////////////////////////////////////
	// retrieve 
	//////////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////
	virtual std::type_info const &	getRTTI			(void) const;
	virtual std::string const &		getName			(void) const;
	virtual NO_UInt32				getSize			(void) const;
	virtual NO_UInt32				getTypeCode		(void) const;

	//////////////////////////////////////////////////////////////////////////
	virtual NO_Type const *			findType		(const NO_Int8* n)					const;
	virtual NO_IBase const *		findBase		(const NO_Int8* n)					const;
	virtual NO_IMember const *		findMember		(const NO_Int8* n)					const;
	virtual NO_IFunction const *	findFunction	(const NO_Int8* n, NO_TypeList& p)	const;
	virtual NO_IConstructor const *	findConstructor	(NO_TypeList& p)					const;
	
	//////////////////////////////////////////////////////////////////////////
	virtual NO_Type const *			findType		(NO_UInt32 ID) const ;
	virtual NO_IBase const *		findBase		(NO_UInt32 ID) const ;
	virtual NO_IMember const *		findMember		(NO_UInt32 ID) const ;
	virtual NO_IFunction const *	findFunction	(NO_UInt32 ID) const;
	virtual NO_IConstructor const *	findConstructor	(NO_UInt32 ID) const;
	
	//////////////////////////////////////////////////////////////////////////
	virtual NO_Type const *			beginType		(void) const ;
	virtual NO_IBase const *		beginBase		(void) const ;
	virtual NO_IMember const *		beginMember		(void) const ;
	virtual NO_IFunction const *	beginFunction	(void) const ;
	virtual NO_IConstructor const *	beginConstructor(void) const ;
	
	//////////////////////////////////////////////////////////////////////////
	virtual NO_Type const *			endType			(void) const ;
	virtual NO_IBase const *		endBase			(void) const ;
	virtual NO_IMember const *		endMember		(void) const ;
	virtual NO_IFunction const *	endFunction		(void) const ;
	virtual NO_IConstructor const *	endConstructor	(void) const ;
	
	//////////////////////////////////////////////////////////////////////////
	virtual NO_Type const *			nextType		(NO_Type const * i)			const ;
	virtual NO_IBase const *		nextBase		(NO_IBase const * i)		const ;
	virtual NO_IMember const *		nextMember		(NO_IMember const * i)		const ;
	virtual NO_IFunction const *	nextFunction	(NO_IFunction const * i)	const ;
	virtual NO_IConstructor const *	nextConstructor	(NO_IConstructor const * i)	const ;

	//////////////////////////////////////////////////////////////////////////
	// use
	//////////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////////
	virtual NO_OArchive&	output (NO_Object& o, NO_OArchive& a) const ;
	virtual NO_IArchive&	input  (NO_Object& o, NO_IArchive& a) const ;
	
	//////////////////////////////////////////////////////////////////////////
	virtual NO_Value* getElement		(NO_Value& d, NO_UInt32 n)			const ;
	virtual NO_Value* getReference		(NO_Value& d)						const ;
	virtual NO_Value* getDereference	(NO_Value& d)						const ;
	virtual NO_Value* getReflect		(NO_Value& d, void* o, NO_UInt32 n)	const ;
	virtual NO_Value* getReplace		(NO_UInt32 n)						const ;
	virtual NO_Value* getCopy			(NO_Value& d)						const ;

private:
	//////////////////////////////////////////////////////////////////////////
	static NO_Namespace* global;

	//////////////////////////////////////////////////////////////////////////
	// con/destruction
	//////////////////////////////////////////////////////////////////////////
	
	//////////////////////////////////////////////////////////////////////////
	NO_Namespace(NO_Int8 const * name);
	~NO_Namespace();

	//////////////////////////////////////////////////////////////////////////
	NO_Namespace(NO_Namespace const &);
	NO_Namespace& operator=(NO_Namespace const &);
};

#endif